package logging

import (
	"fmt"
	"os"
	"runtime"
	"sync"
	"time"
)

var (
	pid            = os.Getpid()                                        // 进程编号
	core           = &Core{}                                            // 日志核心
	logDirMakeOnce = &sync.Once{}                                       // 日志文件夹创建管理
	recordPool     = &sync.Pool{New: func() any { return new(Record) }} // 日志记录池
)

// GetCore 获取日志核心
func GetCore() *Core {
	return core
}

// createLogDir 创建日志文件夹
func createLogDir() {
	if len(core.logDir) == 0 {
		return
	}
	_, err := os.Stat(core.logDir)
	if err == nil {
		return
	}
	if os.IsNotExist(err) {
		err = os.Mkdir(core.logDir, os.ModePerm.Perm())
	}
	if err != nil {
		panic(fmt.Sprintf("创建日志文件夹失败: %v", err))
	}
}

// Out 输出日志
func Out(depth int, channel string, severity Severity, format string, args ...any) {
	// 创建日志文件夹
	logDirMakeOnce.Do(createLogDir)

	// 获取记录
	rec := recordPool.Get().(*Record)

	// 获取文件名和行号
	_, file, line, ok := runtime.Caller(depth + 1)
	if !ok {
		file = "???"
		line = 1
	}

	// 初始化记录
	*rec = Record{
		Time:     time.Now(),
		File:     file,
		Line:     line,
		Depth:    depth + 1,
		Severity: severity,
		Thread:   int64(pid),
		Channel:  channel,
		Format:   format,
		Args:     args,
	}

	// 处理记录
	core.Emit(rec)

	// 回收记录
	recordPool.Put(rec)
}
